<?php
/********************************************************************
 *	Author:
 *		Jestery Liu <jestery@gmail.com>
 *		http://www.pte.cn
 *
 *	File:			UrlMapper.class.php
 *	Create Date:	2007-05-23 11:08:27 CST
 *******************************************************************/
require_once(PTE::getCoreLibsPath().'Request.class.php');

class UrlMapper
{
	/**
	 * Request
	 *
	 * @var HttpRequest
	 */
	protected $request;
	protected $applications = array();
	protected $defaultAction = null;
	protected $pathInfo;

	protected function __construct()
	{
		$this->request = Request::getInstance();
		$this->pathInfo = $this->request->getPathInfo();
	}

	/**
	 * 配置 Action。
	 * 第一个参数表示一个action，用 appName.moduleName.actionName 形式。
	 * 第二个参数是匹配这个 Action 的模式。如果 url 匹配这个模式，那么就使用匹配这个模式的 action
	 * 如果将第三个参数设置为 true，那么没有匹配到任何 action 时将使用这个 action
	 *
	 * @param string $actionName
	 * @param string $regex
	 * @param bool $isDefault
	 */
	protected function hasAction($actionName, $regex, $isDefault=false)
	{
		$this->applications[$regex] = $actionName;
		if ($isDefault)
		{
			$this->defaultAction = $actionName;
		}
	}
	public function map()
	{
		$string = $this->mapAction();
		if ($string!=null)
		{
			list($app, $mod, $act) = explode('.', $string);
			$this->request->setApplicationName($app);
			$this->request->setModuleName($mod);
			$this->request->setActionName($act);
			return true;
		}
		return false;
	}
	protected function mapAction()
	{
		foreach ($this->applications as $regex=>$actionName)
		{
			$pattern = '#'.$regex.'#U';
			if (preg_match($pattern, $this->pathInfo, $matches)>0)
			{
				$params = $this->getValues($matches);
				if (count($params)>0)
				{
					$this->request->setParams($params);
				}
				return $actionName;
			}
		}
		return $this->defaultAction;
	}
	protected function getValues($values)
	{
		$this->processQuery();
		$return = array();
		foreach ($values as $key=>$value)
		{
			if (is_int($key))
			{
				continue;
			}
			$return[$key] = $value;
		}
		return $return;
	}
	protected function processQuery()
	{
		$uri = $this->request->getRequestUri();
		$pos = strpos($uri, '?');
		if ($pos===false)
		{
			return;
		}
		else
		{
			$pos++;
		}
		$query = substr($uri, $pos);
		if (!empty($query))
		{
			foreach (explode('&', $query) as $pair)
			{
				list($key, $value) = explode('=', $pair);
				$_GET[$key] = $value;
			}
		}
	}
}